EF Core DbContext
Home

EF Core DbContext

EF Core DbContext

De kern van het Entity Framework Core is de Microsoft.EntityFrameworkCore.DbContext klasse. Het is deze klasse (of, beter gezegd, de klassen die jij maakt op basis van deze klasse) die de toegangspoort tot de database is en alle methoden biedt die je nodig hebt om met de database te werken.

DbContext

Voordat een klassemodel kan worden gebruikt om een query op een database uit te voeren, moet Entity Framework weten hoe het code (klassen, eigenschappen, en instanties) heen en weer moeten vertalen van C# naar SQL (in het bijzonder, tabellen, kolommen en rijen ). Daarvoor gebruikt het ORM of object relational mapping.

Een context is een klasse die erft van DBContext en die een aantal entiteit-collecties toegankelijk maakt in de vorm van DbSet<T> eigenschappen.

DbContext gebruiken met dependency injection

EF ondersteunt DbContext met een dependency injection container. Je kan het DbContext type toevoegen aan de service container door gebruik te maken van AddDbContext<TContext>.

AddDbContext maakt en voegt een een DbContext type, TContext, en DbContextOptions<TContext> toe, die dan beschikbaar is in de service container voor injectie.

Meer over Dependency injection.

  1. voeg de connectiestring toe appsettings.json:
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      "AllowedHosts": "*",
      "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=mmt;Trusted_Connection=True;
                  MultipleActiveResultSets=true",
        "MmtLocal": "Server=92.222.220.213,1500;Database=_13875_JefInghelbrecht;
                  User Id=sa;Password=xxxxxxxx;MultipleActiveResultSets=true",
        "Mmt": "Server=510.380.377.150;user id=Docent1;password=Docent_XXXXXX;port=3306;
                  database=Docent1;SslMode=none"
      }
    }
    
    
  2. De DBContext wordt geconfigureerd in Startup.cs waar de connectiestring ingelezen wordt uit het appsettings.json configuratiebestand. De GetConfiguration methode haalt de waarde op die overeenkomt met de sleutel Configuration:<connection string name>.
  3. In de Startup klasse moet je verwijzen naar de namespace waarin de DbContext klasse, die voor de database toegang gebruikt, staat:
    using FricFrac.Models.FricFrac;
  4. Evenals naar:
    using Microsoft.EntityFrameworkCore;
  5. De naam van de DbContext klasse, die door scaffolding werd genereerd is de naam van de database. Als je een andere naam wilt geven, verander je de naam van DbContext klasse en van de namespace in dat bestand.
    De naam van die DBContext klasse bestaat uit de naam van de database gevolgd door Context. In ons voorbeeld is dat docent300Context. Voor jullie zal dat userXXX zijn. We wijzigen de naam van de klasse en beginnen de naam met een hoofdletter zoals dat volgens afspraak in .NET moet zijn, namelijk klassenamen worden in pascalnotatie geschreven. In Visual Studio kan je de naam automatisch laten wijzigen zodat je zelf niet moet gaan opzoeken waar je die naam hebt gebruikt:
    Visual Studio Naming rule violation dialog box
    Visual Studio Naming rule violation dialog box
  6. Dan voeg je DbContext van je app toe aan de injection container:
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSingleton<PostcodeApp.Dal.IPostcode>
            (p => new PostcodeApp.Dal.PostcodeXml(new PostcodeApp.Bll.Postcode()));
        services.AddTransient(p => new Controllers.PostcodeController(new PostcodeApp.Dal.PostcodeXml()));
        services.AddDbContext<Docent300Context>(options =>
            options.UseMySQL(Configuration.GetConnectionString("FricFracRemote")));
    }
  7. Als je nog geen instantie hebt van de Configuration klasse moet je die nog eerst nog builden op basis van appsettings.json:
    namespace FricFrac
    {
        public class Startup
        {
            public IConfigurationRoot Configuration { get; }
            public Startup(IHostingEnvironment env)
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
                Configuration = builder.Build();
  8. Verwijder de volgende regel. Ik heb die regel in commentaar gezet zodat je kunt zien welke regel ik bedoel:
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
           #warning To protect potentially sensitive information in your connection string, 
           you should move it out of source code. 
           See http://go.microsoft.com/fwlink/?LinkId=723263 
           for guidance on storing connection strings.
           // optionsBuilder.UseMySql("server=164.132.231.13;user id=docent300;password=XXXXXX;
                port=3306;database=docent300;SslMode=none");
        }
    }
  9. Voeg een constructor argument toe aan je DbContext type dat een DbContextOption aanvaardt:
    public Docent300Context(DbContextOptions<Docent300Context> options) : base(options)
    {
    }
    
    

JI
2020-05-08 16:04:17